#include <cstddef>
#include <iostream>
#include <type_traits>
using namespace std;

class Node
{
public:
    int data;//数据区域
    Node* next;//指向下一个节点数据的指针

    //构造函数
    Node(int data,Node* next=nullptr):data(data),next(next){};
};

class LinkStack
{
    Node* base;
public:
    LinkStack():base(nullptr){}//LinkStack类别构造函数

    int push(int data)
    {
        if(base==nullptr)
        {
            base=new Node(data);//栈为未创建就创建一个栈；
        }
        else
        {
            //这段代码的思路，是使用一个临时指针
            //轮询整个链表，找到next指针为空的节点
            //然后新建这个节点，并将原节点的next指向新的节点
            //然后新建这个节点，并将原节点的next指向新的节点
            Node* temp=base;
            while(temp->next!=nullptr)
            {
                temp=temp->next;
            }
            temp->next=new Node(data);
        }   
        return 0;
    }

    int pop()
    {
        if(base==nullptr)//栈空
        {
            cout<<"ERR:stack empty!"<<endl;
            return -1;
        }
        Node* temp=base;
        while(temp->next->next!=nullptr)//轮询查找头节点后一节点,一定要注意是不等式
        {
            temp=temp->next;
        }
        temp->next=nullptr;
        
        return 0;
    }

    int printStack()
    {
        if(base==nullptr)
        {
            cout<<"ERR:stack empty!"<<endl;
            return -1;
        }
        else
        {
            Node* temp=base;
            while(temp!=nullptr)
            {
                cout<<temp->data<<" ";
                temp=temp->next;
            }
            cout<<endl;
        }
        return 0;
    }

    bool isEmpty()
    {
        return base==nullptr;
    }

    ~LinkStack(){}

    
};



int main(int argc,char **argv)
{
    LinkStack a;
    cout<<a.isEmpty()<<endl;
    a.push(1);
    a.push(2);
    a.push(3);
    a.printStack();
    a.pop();
    a.printStack();

    return 0;
}



